package leetcode_ago.top_k;

/**
 * 有一堆石头，每块石头的重量都是正整数
 * 每一回合，从中选出两块最重的石头，然后将它们一起粉碎。假设石头的重量分别为x和y，且x<=y。那么粉碎的可能结果如下：
 * 如果 x == y，那么两块石头都会被完全粉碎；
 * 如果 x != y，那么重量为 x 的石头将会完全粉碎，而重量为 y 的石头新重量为 y-x。
 * 最后，最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下，就返回 0
 */

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;

/**
 * 分析：
 * 最大堆问题
 * 将所有石头的重量放入最大堆中。每次依次从队列中取出最重的两块石头a和b，必有a>=b。
 * 如果a>b，则将新石头a-b放回到最大堆中；如果a=b，两块石头完全被粉碎，因此不会产生新的石头。重复上述操作，直到剩下的石头少于2块。
 * 最终可能剩下 1块石头，该石头的重量即为最大堆中剩下的元素，返回该元素；也可能没有石头剩下，此时最大堆为空，返回0。
 * 思路：
 * 1.遍历将所有石头放入最大堆
 * 2.对石头进行两次出队（先出的一定>=后出的）判断a==b继续循环，a>b则a-b的值入队
 */
public class Num1046_LastStoneWeight {
    public int lastStoneWeight(int[] stones) {
        Queue<Integer> queue=new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        for(int i:stones){
            queue.offer(i);
        }
        //最大堆入队完毕
        while (queue.size()>1){
            int y= queue.poll();
            int x= queue.poll();
            if(y>x){
                queue.offer(y-x);
            }
        }
        //此时队中没有元素(全粉碎了)或剩余一个石头
        return queue.isEmpty()?0: queue.poll();
    }
}
